package config

import (
	"fmt"
	"github.com/fsnotify/fsnotify"
	"github.com/spf13/viper"
	"log"
)

type Config struct {
	App      AppConfig
	Database DatabaseConfig
	Log      LogConfig
}

type AppConfig struct {
	Name string
	Port string
	Mode string
}

type DatabaseConfig struct {
	Driver   string
	Host     string
	Port     string
	Name     string
	Username string
	Password string
	Charset  string
}

type LogConfig struct {
	Level  string
	Format string
}

var GlobalConfig Config

func InitConfig() {
	// 设置配置文件路径
	viper.SetConfigName("config")
	viper.SetConfigType("yaml")
	viper.AddConfigPath(".")
	viper.AddConfigPath("./config")

	// 读取配置文件
	if err := viper.ReadInConfig(); err != nil {
		log.Fatalf("Error reading config file, %s", err)
	}

	// 监控配置文件变化
	viper.WatchConfig()
	viper.OnConfigChange(func(e fsnotify.Event) {
		fmt.Println("Config file changed:", e.Name)
		if err := viper.Unmarshal(&GlobalConfig); err != nil {
			log.Printf("Error unmarshaling config, %s", err)
		}
	})

	// 将配置赋值给全局变量
	if err := viper.Unmarshal(&GlobalConfig); err != nil {
		log.Fatalf("Error unmarshaling config, %s", err)
	}

	// 打印加载的配置
	fmt.Printf("Loaded config: %+v\n", GlobalConfig)
}
